﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ITProject.Domain;
using ITProject.WebUI.Models.Project;
using ITProject.Domain.Entities;
using System.Web.Mvc;

namespace ITProject.WebUI.Models.ProjectAdmin
{
    /// <summary>
    /// Klasa rozszerzająca SelectListItem w celu przechowywania flagi o tym, czy użytkownik został zaproszony do projektu.
    /// Autor: Jakub Szatkowski
    /// </summary>
    public class NoProjectUserListItem : SelectListItem
    {
        public bool IsInvited { get; set; }
    }
    
    /// <summary>
    /// Model widokowy zarządzania projektami
    /// Autor: Jakub Szatkowski
    /// </summary>
    public class ProjectAdminManageUserViewModel
    {
        public List<SelectListItem> Supervisors { get; set; }
        public List<SelectListItem> Users { get; set; }
        public List<NoProjectUserListItem> NoUsers { get; set; }
        // własnoci uzpełniania z poziomu kontrolera
        //public string Owner { get; set; }
        public bool IsOwner { get; set; }

        /// <summary>
        /// Statyczna metoda konwertujaca tablicę użytkowników i ich ról w danym projekcie na trzy listy modelu widokowego.
        /// Autor: Jakub Szatkowski
        /// </summary>
        /// <param name="users">Użytkownicy serwisu ITProject</param>
        /// <param name="roles">Role użytkowników ITPorject w konkretnym projekcie</param>
        /// <param name="invitedUsers">Flagi dotyczące id użytkowników zaproszonych do projektu</param>
        /// <returns>Obiekt ProjectAdminManageUserViewModel zawierający trzy listy do wyświetlenia i zarządzania.</returns>
        public static ProjectAdminManageUserViewModel Convert(User[] users, UserRole[] roles, int[] invitedUsers)
        {
            ProjectAdminManageUserViewModel manageUsersViewModel = new ProjectAdminManageUserViewModel();
            manageUsersViewModel.Supervisors = new List<SelectListItem>();
            manageUsersViewModel.Users = new List<SelectListItem>();
            manageUsersViewModel.NoUsers = new List<NoProjectUserListItem>();

            for (int i = 0; i < users.Length; i++)
            {
                switch (roles[i])
                {
                    case UserRole.Supervisor:
                        manageUsersViewModel.Supervisors.Add(new SelectListItem { Text = users[i].Login });
                        break;
                    case UserRole.Manager:
                        manageUsersViewModel.Users.Add(new SelectListItem { Text = users[i].Login });
                        break;
                    case UserRole.User:
                        manageUsersViewModel.Users.Add(new SelectListItem { Text = users[i].Login });
                        break;
                    case UserRole.NoRole:
                        bool isInvited = false;
                        if (invitedUsers.Contains(users[i].Id))
                            isInvited = true;
                        manageUsersViewModel.NoUsers.Add(new NoProjectUserListItem { Text = users[i].Login, IsInvited=isInvited });
                        break;
                }
            }
            return manageUsersViewModel;
        }
    }
}